package com.sxu.forkjoindemo;

import java.util.concurrent.RecursiveTask;

/**
 * 自定义任务对象
 * Recursive —— 递归
 * 父类：
 *      RecursiveTask<>：有返回值 泛型为结果的类型
 *      RecursiveAction：无返回结果
 */
public class MyTask extends RecursiveTask<Integer> {
    private int n;

    public MyTask(int n) {
        this.n = n;
    }

    /*
     * 对任务进行拆分
     * MyTask（5） = 5 + MyTask（4）......
     * */
    @Override
    protected Integer compute() {
        if(n==1){
            System.out.println();
            System.out.println(Thread.currentThread().getName() + ": join():" + n);
            return 1;
        }
        // 拆分任务 让另一个线程执行此任务
        MyTask t1 = new MyTask(n-1);
        t1.fork();
        System.out.println(Thread.currentThread().getName() + ": fork():" + n + " , " + t1);
        // 获取任务结果
        t1.join();
        // 合并结果
        int result = n + t1.join();
        System.out.println(Thread.currentThread().getName() + ": join():" + n + " , " + t1 + " , " + result);
        return result;
    }

    @Override
    public String toString() {
        return "MyTask [n=" + n + "]";
    }
}
